package com.settlement.system.codeGenerate;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.builder.CustomFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class CodeGenerator {

    public void run() {
        String url = "jdbc:mysql://139.9.61.230:3306/lazy_tool?zeroDateTimeBehavior=convertToNull&useUnicode" +
                "=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true";
        String username = "root";
        String password = "TjdAHYdoe4oBOS";
        String parentDir = System.getProperty("user.dir");
        String thisClassFullName = this.getClass().getCanonicalName();

        //拼接代码生成路径
        String codeGenerateDir = parentDir + "/src/main/java";
        String mapperGenerateDir = parentDir + "/src/main/resources/mapper";
        String pageName = thisClassFullName.substring(0, thisClassFullName.lastIndexOf("."));
        // 设置过滤表前缀
        List<String> skipTablePrefix = Arrays.asList("oms_", "pms_", "sms_", "ums_", "wms_");

        FastAutoGenerator.create(url, username, password).globalConfig(builder -> {
                    builder.author("huangrensen") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .disableOpenDir().outputDir(codeGenerateDir); // 指定输出目录
                }).templateConfig(builder -> {
                    builder.entity("/templates/entity.java")
                            .controller("/templates/controller.java")
                            .service("/templates/service.java")
                            .mapper("/templates/mapper.java");
                }).packageConfig(builder -> {
                    builder.parent("com.settlement") // 设置父包名
                            .moduleName("system") // 设置父包模块名
                            .controller("controller")
                            .entity("model.entity")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, mapperGenerateDir)); // 设置mapperXml生成路径
                }).strategyConfig(builder -> {
                    builder.addInclude("sys_wechat") // 设置需要生成的表名
                            .addTablePrefix(skipTablePrefix);// 设置过滤表前缀

                    //entity设置
                    builder.entityBuilder().enableLombok() // 开启lombok
                            .enableChainModel() // 开启链式模式
                            .enableFileOverride(); // 覆盖已生成文件

                    //controller设置
                    builder.controllerBuilder().enableFileOverride();

                    //mapper设置
                    builder.mapperBuilder().enableFileOverride();

                    //service设置
                    builder.serviceBuilder().enableFileOverride().formatServiceFileName("%sService");
                }).injectionConfig(builder -> {
                    List<CustomFile> files = new ArrayList<>();
                    // 自定义Query
                    files.add(new CustomFile.Builder()
                            .filePath(codeGenerateDir)
                            .packageName("com.settlement.system.model.query")
                            .templatePath("/templates/VO.java.ftl")
                            .enableFileOverride()
                            .fileName("Query.java")
                            .build());
                    // 自定义Form
                    files.add(new CustomFile.Builder()
                            .filePath(codeGenerateDir)
                            .packageName("com.settlement.system.model.form")
                            .templatePath("/templates/Form.java.ftl")
                            .enableFileOverride()
                            .fileName("Form.java")
                            .build());
                    // 自定义vue文件
                    files.add(new CustomFile.Builder()
                            .filePath(codeGenerateDir)
                            .packageName("com.settlement.system.vuePage")
                            .templatePath("/templates/vue.java.ftl")
                            .enableFileOverride()
                            .fileName(".vue")
                            .build());
                    // 自定义index文件
                    files.add(new CustomFile.Builder()
                            .filePath(codeGenerateDir)
                            .packageName("com.settlement.system.vuePage")
                            .templatePath("/templates/index.java.ftl")
                            .enableFileOverride()
                            .fileName("index.ts")
                            .build());
                    // 自定义type文件
                    files.add(new CustomFile.Builder()
                            .filePath(codeGenerateDir)
                            .packageName("com.settlement.system.vuePage")
                            .templatePath("/templates/types.java.ftl")
                            .enableFileOverride()
                            .fileName("types.ts")
                            .build());
                    // 自定义Listener文件
                    files.add(new CustomFile.Builder()
                            .filePath(codeGenerateDir)
                            .packageName("com.settlement.system.listener.easyexcel")
                            .templatePath("/templates/listener.java.ftl")
                            .enableFileOverride()
                            .fileName("Listener.java")
                            .build());
                    // 自定义ImportVo文件
                    files.add(new CustomFile.Builder()
                            .filePath(codeGenerateDir)
                            .packageName("com.settlement.system.model.vo")
                            .templatePath("/templates/importVo.java.ftl")
                            .enableFileOverride()
                            .fileName("ImportVo.java")
                            .build());
                    builder.customFile(files);
                    // 自定义sql文件
                    files.add(new CustomFile.Builder()
                            .filePath(codeGenerateDir)
                            .packageName("com.settlement.system.vuePage")
                            .templatePath("/templates/menu.sql.ftl")
                            .enableFileOverride()
                            .fileName("Sql.sql")
                            .build());
                    builder.customFile(files);
                }).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }

    public static void main(String[] args) {
        CodeGenerator cg = new CodeGenerator();
        cg.run();
    }
}

